<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI工作市场与薪资趋势数据看板</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
            color: #2c3e50;
            line-height: 1.6;
        }

        .dashboard-container {
            max-width: 1400px;
            margin: 0 auto;
            padding: 20px;
        }

        .header {
            text-align: center;
            background: rgba(255, 255, 255, 0.9);
            backdrop-filter: blur(10px);
            border-radius: 20px;
            padding: 30px;
            margin-bottom: 30px;
            box-shadow: 0 8px 32px rgba(31, 38, 135, 0.1);
            border: 1px solid rgba(255, 255, 255, 0.18);
        }

        .header h1 {
            font-size: 2.5em;
            color: #2c3e50;
            margin-bottom: 10px;
            font-weight: 300;
        }

        .header p {
            font-size: 1.2em;
            color: #7f8c8d;
            margin-bottom: 20px;
        }

        .total-jobs {
            display: inline-block;
            background: linear-gradient(45deg, #74b9ff, #0984e3);
            color: white;
            padding: 15px 30px;
            border-radius: 50px;
            font-size: 1.3em;
            font-weight: bold;
            box-shadow: 0 5px 15px rgba(116, 185, 255, 0.3);
        }

        .grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
            gap: 30px;
            margin-bottom: 30px;
        }

        .card {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(10px);
            border-radius: 20px;
            padding: 30px;
            box-shadow: 0 8px 32px rgba(31, 38, 135, 0.1);
            border: 1px solid rgba(255, 255, 255, 0.18);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }

        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 15px 40px rgba(31, 38, 135, 0.15);
        }

        .card h2 {
            font-size: 1.8em;
            color: #2c3e50;
            margin-bottom: 20px;
            font-weight: 400;
            border-bottom: 3px solid #74b9ff;
            padding-bottom: 10px;
        }

        .chart-container {
            position: relative;
            height: 350px;
            margin-top: 20px;
        }

        .stats-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 20px;
            margin-top: 20px;
        }

        .stat-item {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 20px;
            border-radius: 15px;
            text-align: center;
            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);
        }

        .stat-number {
            font-size: 2em;
            font-weight: bold;
            margin-bottom: 5px;
        }

        .stat-label {
            font-size: 0.9em;
            opacity: 0.9;
        }

        .skills-container {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
            gap: 15px;
            margin-top: 20px;
        }

        .skill-item {
            background: linear-gradient(45deg, #ff9a9e 0%, #fecfef 100%);
            padding: 15px;
            border-radius: 12px;
            text-align: center;
            color: #2c3e50;
            box-shadow: 0 4px 15px rgba(255, 154, 158, 0.3);
            transition: transform 0.2s ease;
        }

        .skill-item:hover {
            transform: scale(1.05);
        }

        .skill-name {
            font-weight: bold;
            font-size: 1.1em;
            margin-bottom: 5px;
        }

        .skill-count {
            font-size: 0.9em;
            opacity: 0.8;
        }

        .countries-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 15px;
            margin-top: 20px;
        }

        .country-item {
            background: linear-gradient(45deg, #a8edea 0%, #fed6e3 100%);
            padding: 20px;
            border-radius: 15px;
            box-shadow: 0 4px 15px rgba(168, 237, 234, 0.3);
        }

        .country-name {
            font-weight: bold;
            font-size: 1.2em;
            color: #2c3e50;
            margin-bottom: 10px;
        }

        .country-stats {
            display: flex;
            justify-content: space-between;
            font-size: 0.9em;
            color: #5a6c7d;
        }

        .wide-card {
            grid-column: 1 / -1;
        }

        .legend {
            display: flex;
            justify-content: center;
            gap: 30px;
            margin-top: 20px;
            flex-wrap: wrap;
        }

        .legend-item {
            display: flex;
            align-items: center;
            gap: 8px;
            padding: 8px 15px;
            background: rgba(255, 255, 255, 0.7);
            border-radius: 20px;
            font-size: 0.9em;
        }

        .legend-color {
            width: 15px;
            height: 15px;
            border-radius: 50%;
        }

        @media (max-width: 768px) {
            .grid {
                grid-template-columns: 1fr;
            }
            
            .header h1 {
                font-size: 2em;
            }
            
            .stats-grid {
                grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
            }
        }
    </style>
</head>
<body>
    <div class="dashboard-container">
        <!-- 头部 -->
        <div class="header">
            <h1>🤖 Global AI工作市场与薪资趋势 2025</h1>
            <p>基于Kaggle数据集的职业规划分析看板</p>
            <div class="total-jobs">📊 总职位数量: 15,000</div>
        </div>

        <!-- 主要统计数据 -->
        <div class="card wide-card">
            <h2>📈 关键指标概览</h2>
            <div class="stats-grid">
                <div class="stat-item">
                    <div class="stat-number">$115,777</div>
                    <div class="stat-label">平均薪资 (USD)</div>
                </div>
                <div class="stat-item">
                    <div class="stat-number">50%</div>
                    <div class="stat-label">平均远程工作比例</div>
                </div>
                <div class="stat-item">
                    <div class="stat-number">8</div>
                    <div class="stat-label">主要职位类型</div>
                </div>
                <div class="stat-item">
                    <div class="stat-number">36</div>
                    <div class="stat-label">涵盖国家/地区数量</div>
                </div>
            </div>
        </div>

        <div class="grid">
            <!-- 技能要求分析 -->
            <div class="card">
                <h2>🎯 热门技能需求分析</h2>
                <p style="color: #7f8c8d; margin-bottom: 20px;">掌握这些技能将大大提升您的就业竞争力</p>
                <div class="chart-container">
                    <canvas id="skillsChart"></canvas>
                </div>
            </div>

            <!-- 经验水平与薪资关系 -->
            <div class="card">
                <h2>📊 职业发展路径</h2>
                <p style="color: #7f8c8d; margin-bottom: 20px;">不同经验水平的薪资发展趋势</p>
                <div class="chart-container">
                    <canvas id="experienceChart"></canvas>
                </div>
            </div>

            <!-- 薪资分布 -->
            <div class="card">
                <h2>💰 薪资分布情况</h2>
                <p style="color: #7f8c8d; margin-bottom: 20px;">AI行业薪资区间分布</p>
                <div class="chart-container">
                    <canvas id="salaryChart"></canvas>
                </div>
            </div>

            <!-- 远程工作分析 -->
            <div class="card">
                <h2>🏠 工作模式分析</h2>
                <p style="color: #7f8c8d; margin-bottom: 20px;">远程、混合、现场工作的分布情况</p>
                <div class="chart-container">
                    <canvas id="remoteChart"></canvas>
                </div>
            </div>
        </div>

        <!-- 国家/地区就业机会对比 -->
        <div class="card wide-card">
            <h2>🌍 全球就业机会对比</h2>
            <p style="color: #7f8c8d; margin-bottom: 20px;">各国AI工作机会与平均薪资水平</p>
            <div class="chart-container">
                <canvas id="countriesChart"></canvas>
            </div>
        </div>

        <!-- 热门技能详细列表 -->
        <div class="card wide-card">
            <h2>🔧 必备技能清单</h2>
            <p style="color: #7f8c8d; margin-bottom: 20px;">AI领域最受欢迎的技能及需求量</p>
            <div class="skills-container">
                <div class="skill-item">
                    <div class="skill-name">Python</div>
                    <div class="skill-count">4,450 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">SQL</div>
                    <div class="skill-count">3,407 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">TensorFlow</div>
                    <div class="skill-count">3,022 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">Kubernetes</div>
                    <div class="skill-count">3,009 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">Scala</div>
                    <div class="skill-count">2,794 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">PyTorch</div>
                    <div class="skill-count">2,777 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">Linux</div>
                    <div class="skill-count">2,705 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">Git</div>
                    <div class="skill-count">2,631 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">Java</div>
                    <div class="skill-count">2,578 个职位需求</div>
                </div>
                <div class="skill-item">
                    <div class="skill-name">GCP</div>
                    <div class="skill-count">2,442 个职位需求</div>
                </div>
            </div>
        </div>

        <!-- 顶级就业国家/地区 -->
        <div class="card wide-card">
            <h2>🏆 顶级就业目的地</h2>
            <p style="color: #7f8c8d; margin-bottom: 20px;">AI人才最活跃的国家/地区</p>
            <div class="countries-grid">
                <div class="country-item">
                    <div class="country-name">🇩🇪 德国</div>
                    <div class="country-stats">
                        <span>814 个职位</span>
                        <span>$121,810 平均薪资</span>
                        <span>48% 远程工作</span>
                    </div>
                </div>
                <div class="country-item">
                    <div class="country-name">🇩🇰 丹麦</div>
                    <div class="country-stats">
                        <span>778 个职位</span>
                        <span>$165,652 平均薪资</span>
                        <span>50% 远程工作</span>
                    </div>
                </div>
                <div class="country-item">
                    <div class="country-name">🇨🇦 加拿大</div>
                    <div class="country-stats">
                        <span>769 个职位</span>
                        <span>$114,253 平均薪资</span>
                        <span>50% 远程工作</span>
                    </div>
                </div>
                <div class="country-item">
                    <div class="country-name">🇫🇷 法国</div>
                    <div class="country-stats">
                        <span>769 个职位</span>
                        <span>$114,411 平均薪资</span>
                        <span>50% 远程工作</span>
                    </div>
                </div>
                <div class="country-item">
                    <div class="country-name">🇦🇹 奥地利</div>
                    <div class="country-stats">
                        <span>765 个职位</span>
                        <span>$85,175 平均薪资</span>
                        <span>51% 远程工作</span>
                    </div>
                </div>
                <div class="country-item">
                    <div class="country-name">🇸🇬 新加坡</div>
                    <div class="country-stats">
                        <span>764 个职位</span>
                        <span>$128,004 平均薪资</span>
                        <span>49% 远程工作</span>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        // 图表配置
        Chart.defaults.font.family = "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif";
        Chart.defaults.color = '#2c3e50';

        // 技能需求图表
        const skillsCtx = document.getElementById('skillsChart').getContext('2d');
        new Chart(skillsCtx, {
            type: 'bar',
            data: {
                labels: ['Python', 'SQL', 'TensorFlow', 'Kubernetes', 'Scala', 'PyTorch', 'Linux', 'Git'],
                datasets: [{
                    label: '职位需求数',
                    data: [4450, 3407, 3022, 3009, 2794, 2777, 2705, 2631],
                    backgroundColor: [
                        'rgba(116, 185, 255, 0.8)',
                        'rgba(255, 154, 158, 0.8)',
                        'rgba(168, 237, 234, 0.8)',
                        'rgba(255, 206, 84, 0.8)',
                        'rgba(153, 102, 255, 0.8)',
                        'rgba(255, 159, 64, 0.8)',
                        'rgba(54, 162, 235, 0.8)',
                        'rgba(255, 99, 132, 0.8)'
                    ],
                    borderColor: [
                        'rgba(116, 185, 255, 1)',
                        'rgba(255, 154, 158, 1)',
                        'rgba(168, 237, 234, 1)',
                        'rgba(255, 206, 84, 1)',
                        'rgba(153, 102, 255, 1)',
                        'rgba(255, 159, 64, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(255, 99, 132, 1)'
                    ],
                    borderWidth: 2,
                    borderRadius: 8
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                plugins: {
                    legend: {
                        display: false
                    }
                },
                scales: {
                    y: {
                        beginAtZero: true,
                        grid: {
                            color: 'rgba(0,0,0,0.1)'
                        }
                    },
                    x: {
                        grid: {
                            display: false
                        }
                    }
                }
            }
        });

        // 经验水平图表
        const experienceCtx = document.getElementById('experienceChart').getContext('2d');
        new Chart(experienceCtx, {
            type: 'line',
            data: {
                labels: ['入门级 (EN)', '中级 (MI)', '高级 (SE)', '专家级 (EX)'],
                datasets: [{
                    label: '平均薪资 (USD)',
                    data: [63133, 87955, 122188, 187724],
                    borderColor: 'rgba(116, 185, 255, 1)',
                    backgroundColor: 'rgba(116, 185, 255, 0.1)',
                    borderWidth: 3,
                    fill: true,
                    tension: 0.4,
                    pointBackgroundColor: 'rgba(116, 185, 255, 1)',
                    pointBorderColor: '#fff',
                    pointBorderWidth: 3,
                    pointRadius: 8
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                plugins: {
                    legend: {
                        display: false
                    }
                },
                scales: {
                    y: {
                        beginAtZero: true,
                        grid: {
                            color: 'rgba(0,0,0,0.1)'
                        },
                        ticks: {
                            callback: function(value) {
                                return '$' + value.toLocaleString();
                            }
                        }
                    },
                    x: {
                        grid: {
                            display: false
                        }
                    }
                }
            }
        });

        // 薪资分布图表
        const salaryCtx = document.getElementById('salaryChart').getContext('2d');
        new Chart(salaryCtx, {
            type: 'doughnut',
            data: {
                labels: ['0-50K', '50K-80K', '80K-120K', '120K-160K', '160K+'],
                datasets: [{
                    data: [1140, 3867, 4431, 2603, 2959],
                    backgroundColor: [
                        'rgba(255, 154, 158, 0.8)',
                        'rgba(255, 206, 84, 0.8)',
                        'rgba(116, 185, 255, 0.8)',
                        'rgba(168, 237, 234, 0.8)',
                        'rgba(153, 102, 255, 0.8)'
                    ],
                    borderColor: [
                        'rgba(255, 154, 158, 1)',
                        'rgba(255, 206, 84, 1)',
                        'rgba(116, 185, 255, 1)',
                        'rgba(168, 237, 234, 1)',
                        'rgba(153, 102, 255, 1)'
                    ],
                    borderWidth: 2
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                plugins: {
                    legend: {
                        position: 'bottom',
                        labels: {
                            padding: 20,
                            usePointStyle: true
                        }
                    }
                }
            }
        });

        // 远程工作图表
        const remoteCtx = document.getElementById('remoteChart').getContext('2d');
        new Chart(remoteCtx, {
            type: 'pie',
            data: {
                labels: ['混合工作', '完全远程', '现场工作'],
                datasets: [{
                    data: [5005, 4920, 5075],
                    backgroundColor: [
                        'rgba(116, 185, 255, 0.8)',
                        'rgba(168, 237, 234, 0.8)',
                        'rgba(255, 154, 158, 0.8)'
                    ],
                    borderColor: [
                        'rgba(116, 185, 255, 1)',
                        'rgba(168, 237, 234, 1)',
                        'rgba(255, 154, 158, 1)'
                    ],
                    borderWidth: 2
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                plugins: {
                    legend: {
                        position: 'bottom',
                        labels: {
                            padding: 20,
                            usePointStyle: true
                        }
                    }
                }
            }
        });

        // 国家/地区就业机会图表
        const countriesCtx = document.getElementById('countriesChart').getContext('2d');
        new Chart(countriesCtx, {
            type: 'bar',
            data: {
                labels: ['德国', '丹麦', '加拿大', '法国', '奥地利', '新加坡', '中国', '印度', '瑞典', '以色列'],
                datasets: [{
                    label: '职位数量',
                    data: [814, 778, 769, 769, 765, 764, 763, 754, 752, 751],
                    backgroundColor: 'rgba(116, 185, 255, 0.8)',
                    borderColor: 'rgba(116, 185, 255, 1)',
                    borderWidth: 2,
                    borderRadius: 8,
                    yAxisID: 'y'
                }, {
                    label: '平均薪资 (千USD)',
                    data: [121.8, 165.7, 114.3, 114.4, 85.2, 128.0, 84.9, 84.2, 123.6, 87.0],
                    type: 'line',
                    borderColor: 'rgba(255, 154, 158, 1)',
                    backgroundColor: 'rgba(255, 154, 158, 0.1)',
                    borderWidth: 3,
                    fill: false,
                    tension: 0.4,
                    pointBackgroundColor: 'rgba(255, 154, 158, 1)',
                    pointBorderColor: '#fff',
                    pointBorderWidth: 3,
                    pointRadius: 6,
                    yAxisID: 'y1'
                }]
            },
            options: {
                responsive: true,
                maintainAspectRatio: false,
                scales: {
                    y: {
                        type: 'linear',
                        display: true,
                        position: 'left',
                        title: {
                            display: true,
                            text: '职位数量'
                        },
                        grid: {
                            color: 'rgba(0,0,0,0.1)'
                        }
                    },
                    y1: {
                        type: 'linear',
                        display: true,
                        position: 'right',
                        title: {
                            display: true,
                            text: '平均薪资 (千USD)'
                        },
                        grid: {
                            drawOnChartArea: false
                        }
                    },
                    x: {
                        grid: {
                            display: false
                        }
                    }
                },
                plugins: {
                    legend: {
                        position: 'top',
                        labels: {
                            padding: 20,
                            usePointStyle: true
                        }
                    }
                }
            }
        });
    </script>
</body>
</html>